package xlog

import (
	"io"
)

const (
	FileShort    = 1 << iota // 文件简短名, 如: test.go:11
	FileLong                 // 文件全路径, 如: /a/b/c/test.go:11
	XLogDate                 // 日期, 如: 2008-02-22
	XLogTime                 // 时间, 如: 01:23:23
	XLogTimeMill             // 毫秒级时间, 如: 01:23:23.675
	FileTimeStd  = FileShort | XLogDate | XLogTimeMill
)

// Config logger 配置
type Config struct {
	StdPrint           bool // 是否输出到控制台
	StdPrintLevelColor bool // 根据内容打印颜色, 如果要写入日志文件的话, 这里将失效
	PrintErrStack      bool // log err 时是否要打印堆栈信息
	Writer             []io.Writer
	Flags              int            // log 标记
	Level              int            // 日志级别
	CallSkip           int            // 获取调用信息需要跳过的调用层数
	Prefix             string         // 前缀
	FilePath           string         // 日志文件
	LevelPrefixes      map[int]string // 自定义前缀
}

// NewDefaultConfig 默认配置
func NewDefaultConfig() *Config {
	return &Config{
		StdPrint:           true,
		StdPrintLevelColor: true,
		Flags:              FileTimeStd,
		Level:              LevelDev,
	}
}

// StdPrint 设置是否打印到控制台
func (x *XLogger) StdPrint(print bool) {
	x.config.StdPrint = print
}

// Writer 设置打印到, 设置了, 就不会打印到 文件和控制台
func (x *XLogger) Writer(w ...io.Writer) {
	x.config.Writer = append(x.config.Writer, w...)
}

// Flags 设置需要打印的标记
func (x *XLogger) Flags(flags int) {
	x.config.Flags = flags
}

// Prefix 日志前缀
func (x *XLogger) Prefix(v string) {
	x.config.Prefix = v
}

// FilePath 日志文件路径
func (x *XLogger) FilePath(path string) {
	// l := len(path)
	// sysSplit := xdebug.GetSysPathSplitSymbol()
	// if l > 0 && string(path[l-1]) != sysSplit {
	// 	path += sysSplit
	// }
	x.config.FilePath = path
}

// StdPrintLevelColor 是否需要对日志级别标记颜色
func (x *XLogger) StdPrintLevelColor(print bool) {
	x.config.StdPrintLevelColor = print
}

// PrintErrStack 是否要打印 stack
func (x *XLogger) PrintErrStack(print bool) {
	x.config.PrintErrStack = print
}

// Skip 设置打印调用跳过的层数
func (x *XLogger) Skip(skip int) *XLogger {
	x.config.CallSkip = skip
	return x
}
